 
  

 






<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> 
<html>

<!-- Mirrored from www.javapractices.com/topic/TopicAction.do?Id=173 by HTTrack Website Copier/3.x [XR&CO'2010], Sun, 12 Jun 2011 17:28:07 GMT -->
<!-- Added by HTTrack --><meta http-equiv="content-type" content="text/html;charset=UTF-8"><!-- /Added by HTTrack -->
<head>
 <title>
  Java Practices -> Encapsulate collections
 </title>
 <link rel="stylesheet" type="text/css" href="../stylesheet8.css" media="all">
 
 <link rel="shortcut icon" href='../images/favicon.ico' type="image/vnd.microsoft.icon">
 <meta name="description" content="Concise presentations of java programming practices, tasks, and conventions, amply illustrated with syntax highlighted code examples.">
 
 <meta name='keywords' content='BaseballTeam,defensive,SoccerTeam,collection,java,java programming,java practices,java idiom,java style,java design patterns,java coding conventions,'>
 
 
</head>
 
<body>


<div class='menu-bar'>
 
  <a href='../home/HomeAction.html' title='Table of Contents'>Home</a> |
  <a href='../vote/VoteSummaryAction-2.html' title='View Poll Results'>Poll</a> |
   
  <A href='../feedback/FeedbackAction451f-2.html?Operation=Show' title='Send Your Feedback'>Wiki</a> |
  <b><a href='../source/SourceAction-2.html' title='Grab Source Code'>Source Code</a></b><IMG class='no-margin' SRC="../images/goldstar.gif" ALT=""> |

  <a href='http://www.web4j.com/Java_Web_Application_Framework_Overview.jsp?From=1' title='Free Download - Java Web Application Framework'><b>WEB4J</b></a> |
  
  <a href='http://www.date4j.net/' title='Replacement for java.util.Date'><b>DATE4J</b></a> |

   <a href='../references/ReferencesAction-2.html' title='References'>Links</a>
   
  <form action='http://www.javapractices.com/search/SearchAction.do' method='get' class='search-form'>
   <input type='text' name='SearchTerms' value="" size=12 maxlength=50 class='search'>
   <input type='submit' value="Search">
  </form>
 
</div>

<P>



  

 






<p class="display-messages">

 

 

</p>


<div class="main-layout">
 
   

 




<div class='page-title'>Encapsulate collections</div>

<div class='main-body'>
 
<br>In general, Collections are not <a href="TopicActiond838-2.html">immutable objects</a>.
As such, one must often exercise care that collection <em>fields</em> are not 
<em>unintentionally</em> exposed to the caller.

<p>One technique is to define a set of related methods which prevent the
caller from directly using the underlying collection, such as :
<ul>
<li>
<tt>addThing(Thing)</tt></li>

<li>
<tt>removeThing(Thing)</tt></li>

<li>
<tt>getThings()</tt> - return an <i>unmodifiable</i> <tt>Collection</tt></li>
</ul>

<b>Example 1</b> 
<br>
<PRE>

<span class='keyword'>import</span> java.util.*;

<span class='keyword'>public</span> <span class='keyword'>final</span> <span class='keyword'>class</span> SoccerTeam {

  <span class='keyword'>public</span> SoccerTeam(String aTeamName, String aHeadCoachName){
    <span class='comment'>//..elided
</span>  }

  <span class='keyword'>public</span> <span class='keyword'>void</span> addPlayer(Player aPlayer){
    fPlayers.add(aPlayer);
  }

  <span class='keyword'>public</span> <span class='keyword'>void</span> removePlayer(Player aPlayer){
    fPlayers.remove(aPlayer);
  }

  <span class='keyword'>public</span> Set&lt;Player&gt; getPlayers(){
    <span class='keyword'>return</span> Collections.unmodifiableSet(fPlayers);
  }

  <span class='comment'>//..elided
</span>
  <span class='comment'>// PRIVATE //
</span>  <span class='keyword'>private</span> Set&lt;Player&gt; fPlayers = <span class='keyword'>new</span> LinkedHashSet&lt;Player&gt;();
  <span class='keyword'>private</span> String fTeamName;
  <span class='keyword'>private</span> String fHeadCoachName;
} 
</PRE>
<br>
<b>Example 2</b> 
<P><tt>BaseballTeam</tt> is an example of exposing the collection directly
to the caller. This is not necessarily an incorrect design, but it is riskier,
since the contents of the collection can be directly changed by both <tt>BaseballTeam</tt>
and its caller :
<br>
<PRE>

<span class='keyword'>import</span> java.util.*;

<span class='keyword'>public</span> <span class='keyword'>final</span> <span class='keyword'>class</span> BaseballTeam {

  <span class='keyword'>public</span> BaseballTeam(String aTeamName, String aHeadCoachName){
    <span class='comment'>//..elided
</span>  }

  <span class='keyword'>public</span> <span class='keyword'>void</span> setPlayers(Set&lt;Player&gt; aPlayers){
    fPlayers = aPlayers;
  }

  <span class='keyword'>public</span> Set&lt;Player&gt; getPlayers(){
    <span class='keyword'>return</span> fPlayers;
  }

  <span class='comment'>//..elided
</span>
  <span class='comment'>// PRIVATE //
</span>  <span class='keyword'>private</span> Set&lt;Player&gt; fPlayers;
  <span class='keyword'>private</span> String fTeamName;
  <span class='keyword'>private</span> String fHeadCoachName;
} 
</PRE>
<br>
<br>
<br>

</div>




<div class='topic-section'>See Also :</div>
<div class='main-body'>
 
  
  <a href='TopicAction79f1-2.html?Id=15'>Defensive copying</a> <br>
 
  
  <a href='TopicActiond838-2.html?Id=29'>Immutable objects</a> <br>
 
</div>


<div class='topic-section'>Would you use this technique?</div>
<div class='main-body'>
  
  <form action="http://www.javapractices.com/vote/AddVoteAction.do" method='post'>
    Yes<input type='radio' name='Choice' value='Y' >
    &nbsp;&nbsp;No<input type='radio' name='Choice' value='N'>
    &nbsp;&nbsp;Undecided<input type='radio' name='Choice' value="?" >
    &nbsp;&nbsp;<input type=submit value="Vote" >
    <input type='hidden' name='Operation' value='Apply'>
    <input type='hidden' name='TopicId' value='173'>
  </form>
</div>

<div style='height:10.0em;'></div>

 
 
</div>

  

 





<div align='center' class='legalese'>  
&copy; 2011 Hirondelle Systems |
<a href='../source/SourceAction-2.html'><b>Source Code</b></a><IMG class='no-margin' SRC="../images/goldstar.gif" ALT=""> |
<a href="mailto:webmaster@javapractices.com">Contact</a> |
<a href="http://creativecommons.org/licenses/by-nc-sa/1.0/">License</a> |
<a href='../apps/cjp.rss'>RSS</a>
<!-- ukey="2AC36CD2" -->
<!-- ckey="16DF3D87" -->
<br>

 Individual code snippets can be used under this <a href='../LICENSE.txt'>BSD license</a> - Last updated on June 6, 2010.<br>
 Over 150,000 unique IPs last month - <span title='Java Practices 2.6.5, Mon May 16 00:00:00 EDT 2011'>Built with</span> <a href='http://www.web4j.com/'>WEB4J</a>.<br>
 - In Memoriam : Bill Dirani -
</div>

<script src="../../www.google-analytics.com/urchin.js" type="text/javascript">
</script>
<script type="text/javascript">
_uacct = "UA-2633428-1";
urchinTracker();
</script>



</body>

<!-- Mirrored from www.javapractices.com/topic/TopicAction.do?Id=173 by HTTrack Website Copier/3.x [XR&CO'2010], Sun, 12 Jun 2011 17:28:07 GMT -->
<!-- Added by HTTrack --><meta http-equiv="content-type" content="text/html;charset=UTF-8"><!-- /Added by HTTrack -->
</html>
